package com.woniuxy.ShiroIniTest;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

//自定义域 重新认证和授权的具体方法
public class CustomRealm extends AuthorizingRealm {
    //自定义授权的信息：类似ini中配置好的权限绑定关系！
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //登录认证成功后，从SimpleAuthenticationInfo中取出的校长的信息
        String primaryPrincipal = principals.getPrimaryPrincipal()+"";
        //模拟去数据库中，查出该用户的所有角色和权限，并封装到SimpleAuthorizationInfo中！
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        //添加角色：角色和权限是从哪里来的！
        simpleAuthorizationInfo.addRole("boss");
        simpleAuthorizationInfo.addRole("teacher");
        //添加权限：
        simpleAuthorizationInfo.addStringPermission("eat::person");
        simpleAuthorizationInfo.addStringPermission("yue::ma");
        return simpleAuthorizationInfo;
    }

     // 登录认证的操作：具体登录后封装信息用！同时还能去数据库判断账号密码是否匹配
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        //mybatis调用方法去数据库查出所有的 密码 和 用户 等信息。
        //假的模拟的数据 if就是去数据库查出的用户信息数据
        if ("wangwu".equals(username)){
            //返回给shiro一个SimpleAuthenticationInfo，以便底层去帮你匹配信息校验登录情况。
            //这个里面的凭证信息都是来自数据库中的，都是正确的，但是你传的密码不一定正确的 11111 来自数据库
            return new SimpleAuthenticationInfo(username,"11111","CustomRealm");
        }else{
            //说明数据库没有这个账号
            //throw AuthorizationException("该账号不存在！")
        }
        return null;
    }
}
